<?php
/**
 * 自定义全局函数
 */

/**
 * 加载辅助函数
 * @param string $class_name
 * @return object
 */


if (!function_exists('load_helper')) {
    function load_helper($helper_name)
    {
        //先加载系统的辅助函数
        if (file_exists(__DIR__ . '/' . $helper_name . '.php')) {
            require_once __DIR__ . '/' . $helper_name . '.php';

            //如果存在则返回
            return;
        }

        //再加载App目录下heler文件夹
        if (file_exists(app_path('Helper') . '/' . $helper_name . '.php')) {
            require_once app_path('Helper') . '/' . $helper_name . '.php';

            //如果存在则返回
            return;
        }
    }
}

if (!function_exists('array_map_recursive')) {
    /**
     * @param $filter
     * @param $data
     * @return array
     */
    function array_map_recursive($filter, $data)
    {
        $result = [];
        foreach ($data as $key => $val) {
            $result[$key] = is_array($val) ? array_map_recursive($filter, $val) : call_user_func($filter, $val);
        }
        return $result;
    }
}

if (!function_exists('get_next')) {
    /**
     * 递归获取子分类ID
     * @param array $array 分类数据
     * @param int $id ID
     * @return array $list 子分类ID
     */
    function get_next($array, $id)
    {
        static $list = [];
        foreach ($array as $key => $value) {
            if ($value['pid'] == $id) {
                $list[] = $value['id'];
                unset($array[$key]);
                get_next($array, $value['id']);
            }
        }
        return $list;
    }
}

if (!function_exists('tree')) {
    /**
     * 树状图逻辑处理
     * @param array $data
     * @param string $selected
     * @param string $type
     * @return array
     */
    function tree(&$data, $selected = '', $type = '')
    {
        if (!empty($selected)) {
            $selected = strpos($selected, ',') ? explode(',', $selected) : [$selected];
            if (!empty($data) && is_array($data)) {
                foreach ($data as &$item) {
                    $item['tree_id'] = $item['id'];
                    if (in_array($item['id'], $selected)) {
                        $item['checked'] = true;
                    }
                }
            }
        }
        $data = \App\Util\Tree::treeArray($data);
        if (in_array($type, ['select', 'parent'])) {
            $data = [
                ['id' => 0, 'text' => "", 'pid' => 0, 'children' => $data]
            ];
        }
        return $data;
    }
}

/**
 * 获取客户ip地址
 * @author: 亮 <chenjialiang@han-zi.cn>
 */
if (!function_exists('get_client_ip')) {
    function get_client_ip($is_to_long = true)
    {
        $ip = Request()->getClientIp();

        if ($is_to_long) {
            //转为int形式
            $ip = ip2long($ip);
        }

        return $ip;
    }
}


if (!function_exists('dir_exists')) {
    /**
     * @param string $path 目录路径
     * @return bool
     */
    function dir_exists($path)
    {
        $f = true;
        if (file_exists($path) == false) {//创建目录
            if (mkdir($path, 0777, true) == false)
                $f = false;
            else if (chmod($path, 0777) == false)
                $f = false;
        }

        return $f;
    }
}

if (!function_exists('make_dir')) {
    /**
     * 递归生成目录
     * 如果使用/开头则认为是使用绝对路径
     * @param $filepath
     * @return bool
     */
    function make_dir($filepath)
    {
//    /* 路径为空返回true */
        if (empty($filepath) && 0 !== $filepath && "0" !== $filepath) {   // 排除0
            return true;
        }

        $reval = false;
        //1. 检查目录是否存在
        if (!file_exists($filepath)) {
            /* 如果目录不存在则尝试创建该目录 */
            @umask(0);
            //2. 检查是否有父目录
            $parentpath = substr($filepath, 0, strrpos($filepath, DIRECTORY_SEPARATOR));
            //3. 调用本身检查父目录是否存在
            $res = make_dir($parentpath);
            //4. 父目录存在则生成目录
            if ($res) {
                if (@mkdir(rtrim($filepath, DIRECTORY_SEPARATOR), 0755)) {
                    @chmod($filepath, 0755);
                    $reval = true;
                }
            }
        } else {
            /* 路径已经存在。返回该路径是不是一个目录 */
            $reval = is_dir($filepath);
        }
        clearstatcache();
        //5. 目录存在返回 true
        return $reval;
    }
}


if (!function_exists('module_url')) {
    /**
     * 创建模块化路由
     * @param $url "Admin/index/index"
     * @param array $params ['id'=>1]
     * @return \Illuminate\Contracts\Routing\UrlGenerator|string
     */
    function module_url($url, $params = [])
    {
        if (empty($url)) {
            return '';
        }
        $url = explode('/', $url);

        $class = defined('NAMESPACE_NAME') ? NAMESPACE_NAME : '';
        $class = explode('/', $class);
        $class = array_map('lcfirst', $class);
        $module = implode('/', $class);

        switch (count($url)) {
            case 1:
                array_unshift($url, $module, Str::replaceLast("Controller", '', CONTROLLER_NAME));
                break;
            case 2:
                array_unshift($url, $module);
                break;
        }

        $url = array_map([Str::class, 'snake'], $url);
        $url = trim(implode("/", $url), '/');
        if (!(strpos($url, 'admin/') === 0)) {
            $url = 'admin/' . $url;
        }
        $url = url($url);
        if (!empty($params)) {
            array_walk($params, function (&$item, $key) {
                $item = $key . '=' . $item;
            });
            $url .= "?" . implode('&', $params);
        }
        return $url;
    }
}

/**
 * 组装文件url路径
 * @author: 亮
 */
if (!function_exists('file_url')) {
    function file_url($path, $is_cloud = false, $type = 'img')
    {
        if (empty($path)) {
            return '';
        }

        $domain = !$is_cloud ? request()->getSchemeAndHttpHost() : Config::get('aliyun.oss.' . $type . '_domain');
        return $domain . $path;
    }
}

if (!function_exists('generate_sn')) {
    function generate_sn($prefix): string
    {
        return $prefix . date('YmdHis') . rand(1000, 9999);
    }
}

/**
 * 取汉字的第一个字的首字母
 */
if (!function_exists('first_charter_letter')) {
    /**
     * @param string $str 中文
     * @return bool
     */
    function first_charter_letter($str)
    {
        if (empty($str)) {
            return '';
        }
        $fchar = ord($str[0]);
        if ($fchar >= ord('A') && $fchar <= ord('z')) return strtoupper($str[0]);
        $s1 = iconv('UTF-8', 'gbk', $str);
        $s2 = iconv('gbk', 'UTF-8', $s1);
        $s = $s2 == $str ? $s1 : $str;

        $asc = ord($s[0]) * 256 + ord($s[1]) - 65536;
        if ($asc >= -20319 && $asc <= -20284) return 'A';
        if ($asc >= -20283 && $asc <= -19776) return 'B';
        if ($asc >= -19775 && $asc <= -19219) return 'C';
        if ($asc >= -19218 && $asc <= -18711) return 'D';
        if ($asc >= -18710 && $asc <= -18527) return 'E';
        if ($asc >= -18526 && $asc <= -18240) return 'F';
        if ($asc >= -18239 && $asc <= -17923) return 'G';
        if ($asc >= -17922 && $asc <= -17418) return 'H';
        if ($asc >= -17417 && $asc <= -16475) return 'J';
        if ($asc >= -16474 && $asc <= -16213) return 'K';
        if ($asc >= -16212 && $asc <= -15641) return 'L';
        if ($asc >= -15640 && $asc <= -15166) return 'M';
        if ($asc >= -15165 && $asc <= -14923) return 'N';
        if ($asc >= -14922 && $asc <= -14915) return 'O';
        if ($asc >= -14914 && $asc <= -14631) return 'P';
        if ($asc >= -14630 && $asc <= -14150) return 'Q';
        if ($asc >= -14149 && $asc <= -14091) return 'R';
        if ($asc >= -14090 && $asc <= -13319) return 'S';
        if ($asc >= -13318 && $asc <= -12839) return 'T';
        if ($asc >= -12838 && $asc <= -12557) return 'W';
        if ($asc >= -12556 && $asc <= -11848) return 'X';
        if ($asc >= -11847 && $asc <= -11056) return 'Y';
        if ($asc >= -11055 && $asc <= -10247) return 'Z';
        return '#';
    }
}

/**
 *  判断字符串是否是身份证号
 *  author:xiaochuan
 * @param string $idcard 身份证号码
 */
if (!function_exists('is_idcard')) {
    function is_idcard($idcard)
    {
        if (empty($idcard)) {
            return false;
        }
        #  转化为大写，如出现x
        $idcard = strtoupper($idcard);
        #  加权因子
        $wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
        $ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
        #  按顺序循环处理前17位
        $sigma = 0;
        #  提取前17位的其中一位，并将变量类型转为实数
        for ($i = 0; $i < 17; $i++) {
            $b = (int)$idcard[$i];
            #  提取相应的加权因子
            $w = $wi[$i];
            #  把从身份证号码中提取的一位数字和加权因子相乘，并累加
            $sigma += $b * $w;
        }
        #  计算序号
        $sidcard = $sigma % 11;
        #  按照序号从校验码串中提取相应的字符。
        $check_idcard = $ai[$sidcard];
        if ($idcard[17] == $check_idcard) {
            return true;
        } else {
            return false;
        }
    }
}

/**
 * 获取身份证信息
 *
 * */
if (function_exists('get_idcard_info')) {
    function get_idcard_info($idcard)
    {
        if (is_idcard($idcard)) {
            // 根据身份证信息获取生日、性别
            $sex = (int)substr($idcard, 16, 1);
            $sex = $sex % 2;
            $bir = substr($idcard, 6, 8);
            $year = (int)substr($bir, 0, 4);
            $month = (int)substr($bir, 4, 2);
            $day = (int)substr($bir, 6, 2);
            return [empty($sex) ? \App\Enums\SexesEnum::FEMALE : \App\Enums\SexesEnum::MALE, $year . "-" . $month . "-" . $day];
        } else {
            return [0, null];
        }
    }
}

if (function_exists('downloadNetFile')) {
    function downloadNetFile($url, $save_dir = '', $filename = '', $type = 0)
    {
        if (trim($url) == '') {
            return false;
        }
        if (trim($save_dir) == '') {
            $save_dir = './';
        }
        if (0 !== strrpos($save_dir, '/')) {
            $save_dir .= '/';
        }
        //创建保存目录
        if (!file_exists($save_dir) && !mkdir($save_dir, 0777, true)) {
            return false;
        }
        //获取远程文件所采用的方法
        if ($type) {
            $ch = curl_init();
            $timeout = 5;
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
            $content = curl_exec($ch);
            curl_close($ch);
        } else {
            ob_start();
            readfile($url);
            $content = ob_get_contents();
            ob_end_clean();
        }
        $size = strlen($content);
        //文件大小
        $fp2 = @fopen($save_dir . $filename, 'w');
        fwrite($fp2, $content);
        fclose($fp2);
        unset($content, $url);
        return array(
            'file_name' => $filename,
            'save_path' => $save_dir . $filename
        );
    }

}

if (!function_exists('getFileUrl')) {
    function getFileUrl($path, $default_path = '', $disk = '')
    {
        $disk = $disk ?: config('filesystems.default');
        if (!empty($path)) {
            $http_exists = \Str::startsWith($path, ['https://', 'http://']);
            if ($http_exists) {
                return $path;
            }
            return \Storage::disk($disk)->url($path);
        }
        return !empty($default_path) ? \Storage::disk($disk)->url($default_path) : "";
    }
}


if (!function_exists('fullDateArr')) {
    function fullDateArr($date_list)
    {
        if (is_array($date_list)) {
            $date_1 = data_get($date_list, '0', date('Y-m-d'));
            if (date('Y-m-d', strtotime($date_1)) == $date_1) {
                $date_1 .= ' 00:00:00';
            }
            $date_2 = data_get($date_list, '1', date('Y-m-d'));
            if (date('Y-m-d', strtotime($date_2)) == $date_2) {
                $date_2 .= ' 23:59:59';
            }
            $date_list = [$date_1, $date_2];
        } else {
            $date_list = [now()->startOfDay(), now()->endOfDay()];
        }
        return $date_list;
    }
}

if (!function_exists("checkLuhn")) {
    function checkLuhn($card)
    {
        $len = strlen($card);
        $all = [];
        $sum_odd = 0;
        $sum_even = 0;
        for ($i = 0; $i < $len; $i++) {
            $all[] = substr($card, $len - $i - 1, 1);
        }
        //all 里的偶数key都是我们要相加的奇数位
        for ($k = 0; $k < $len; $k++) {
            if ($k % 2 == 0) {
                $sum_odd += $all[$k];
            } else {
                //奇数key都是要相加的偶数和
                if ($all[$k] * 2 >= 10) {
                    $sum_even += $all[$k] * 2 - 9;
                } else {
                    $sum_even += $all[$k] * 2;
                }
            }
        }
        $total = $sum_odd + $sum_even;
        if ($total % 10 == 0) {
            return true;
        } else {
            return false;
        }
    }
}


